跳到主要内容

05 中断

up的视频讲解

从“正在做一件事,另一件事突然到来”出发,理解中断请求、优先级和现场恢复。

1 为什么需要中断​

写作业时听到吃饭的提醒,你会暂时记下做到哪里,处理完新的事情后再回来继续。中断的思路与此相似:CPU 暂停当前流程,处理需要响应的事件,然后回到原来的位置。

STM32 的外设可以与 CPU 并行工作。定时器持续计数,串口接收数据,ADC 完成转换;CPU 不必始终守着其中一个外设等待。

外设在各自的硬件通路中工作,需要处理结果时再通知 CPU。
外设在各自的硬件通路中工作,需要处理结果时再通知 CPU。

轮询是程序反复检查状态;中断则由事件向 CPU 发出请求。二者解决的是“什么时候处理”这个问题,外设本身的工作仍由相应硬件完成。

2 NVIC 如何管理多个请求​

多个外设都可能发出中断,不能让它们随意打断程序。NVIC(嵌套向量中断控制器)负责管理请求是否允许响应,以及多个请求之间的先后关系。

外设请求先进入 NVIC,再由内核执行相应的处理程序。
外设请求先进入 NVIC,再由内核执行相应的处理程序。

使能中断,可以理解为允许这个请求被处理。中断向量表则记录处理程序的入口信息,让内核知道发生某类事件后应该跳到哪里执行。

向量表把“事件来源”与“处理程序入口”对应起来。
向量表把“事件来源”与“处理程序入口”对应起来。

3 优先级:谁先执行,谁能够抢占​

优先级需要分清两层含义:

类型解决的问题
抢占优先级当前正在处理中断时,新请求能否打断它
子优先级抢占优先级相同且请求同时等待时,先处理哪一个

优先级的数值越小,优先程度越高。具有相同抢占优先级的中断,不能仅凭子优先级打断彼此。

优先级分组把可用的优先级位分给抢占优先级和子优先级。
优先级分组把可用的优先级位分给抢占优先级和子优先级。

课程通过不同分组说明这个取舍:给抢占优先级分配更多位,就能表达更多抢占层次;相应地,子优先级可表达的层次会减少。

4 一次中断的完整过程​

  1. 请求:外设出现事件,产生标志并发出中断请求。
  2. 响应:满足使能和优先级条件后,内核保存必要的运行现场。
  3. 处理:跳到对应的中断服务程序,处理事件。
  4. 返回:恢复现场,继续先前被打断的程序。
按请求、响应、处理、返回四个阶段读图。
按请求、响应、处理、返回四个阶段读图。

现场包含恢复执行所需的信息。栈以“后进先出”的方式保存和取回这些信息,栈指针 SP 跟踪栈的位置,程序计数器 PC 则与执行位置相关。

保存与恢复成对发生,处理结束后才能接着原来的流程运行。
保存与恢复成对发生,处理结束后才能接着原来的流程运行。

后面的 EXTI 实验会把这套过程落实到按键:按键边沿产生请求,中断处理更新程序状态,主循环根据状态运行流水灯。